﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class AvanceActividadesList : System.Web.UI.Page
    {
        public string SortExpression
        {
            get
            {
                return ViewState["gv_SortExpression"] == null ? "" : ViewState["gv_SortExpression"].ToString();
            }
            set
            {
                ViewState["gv_SortExpression"] = value;
            }
        }

        public string SortDirection
        {
            get
            {
                return ViewState["gv_SortDirection"] == null ? "" : ViewState["gv_SortDirection"].ToString();
            }
            set
            {
                ViewState["gv_SortDirection"] = value;
            }
        }

        private int IdSeleccionado
        {
            get { return (int)ViewState["IdSeleccionado"]; }
            set { }
        }

        /// <summary>
        /// Los componentes.
        /// </summary>
        private List<MovimientoContador> MovimientoContadorList
        {
            get
            {
                return ViewState["MovimientoContadorList"] == null ? null : (List<MovimientoContador>)ViewState["MovimientoContadorList"];
            }
            set
            {
                ViewState["MovimientoContadorList"] = value;
            }
        }

        [Serializable]
        private class MovimientoContador
        {
            public int CodigoMovimiento { get; set; }
            public int Prendas { get; set; }            
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.AvanceActividades);
                Master.AgregarBreadcrumb("Avance de Actividades", "#", true);
                Master.AgregarBreadcrumb("Listado", "#", false);

                warningMessage.Visible = false;
                errorMessage.Visible = false;
                lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, 3);

                MovimientoContadorList = new List<MovimientoContador>();
                CargaLineas();
                ListarOrdenes();      
          

            }
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                ListarOrdenes();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            Response.Redirect("AvanceActividadesForm.aspx?Operacion=" + (int)AccionesForm.Adicionar);
        }


        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(((LinkButton)sender).Text, out codigo))
                {
                    Response.Redirect("AvanceActividadesForm.aspx?Operacion=" + (int)AccionesForm.Consultar + "&MovimientoId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvPagerPageChanged(object sender, DataNavigatorEventArgs e)
        {
            ListarOrdenes();
        }

        private void ListarOrdenes()
        {
            TablasDataContext database = new TablasDataContext();

            int codigo = txtCodigo.Text == string.Empty ? 0 : Convert.ToInt32(txtCodigo.Text);
            int linea =  Convert.ToInt32(ddlLinea.SelectedValue);
            DateTime? fecha = null;
            if (txtFechaMovimiento.Text != string.Empty)
                fecha = Convert.ToDateTime(txtFechaMovimiento.Text);

            var listarQuery = from Ordenes in database.PR_Movimiento
                              where (Ordenes.OrdPro_Id == codigo || codigo == 0)
                              && (Ordenes.Proveedor_Nombre.Contains(txtProveedor.Text) || txtProveedor.Text == string.Empty)
                              && (Ordenes.Proceso_Descripcion.Contains(txtProceso.Text) || txtProceso.Text == string.Empty)
                              && (Ordenes.Actividad_Descripcion.Contains(txtActividad.Text) || txtActividad.Text == string.Empty)
                              && (Ordenes.Linea_Id == linea || linea == 0)
                              && (Ordenes.Movimiento_Fecha == fecha || fecha == null)                              
                              select Ordenes;

            var listaContadores = from detalles in database.PR_MovimientoDetalle
                                  group detalles by detalles.Movimiento_Id into g
                                  select new
                                  {
                                      codigoMovimiento = g.Key,
                                      prendas = g.Sum(c => c.MovDet_Avance)                                      
                                  };

            foreach (var item in listaContadores)
            {
                MovimientoContadorList.Add(new MovimientoContador()
                {
                    CodigoMovimiento = item.codigoMovimiento,
                    Prendas = item.prendas.Value
                });
            }

            listarQuery = OrdenarQuery(listarQuery);

            var listarQuery1 = listarQuery.Skip((gvPager.CurrentPage - 1) * gvPager.PageSize).Take(gvPager.PageSize).ToList();

            gvMovimiento.DataSource = listarQuery1;
            gvMovimiento.DataBind();

            int totalReg = listarQuery.Count();

            if (totalReg > 0)
            {
                gvMovimiento.UseAccessibleHeader = false;
                gvMovimiento.HeaderRow.TableSection = TableRowSection.TableHeader;
                gvPager.Visible = true;
                gvPager.TotalRowCount = totalReg;
                warningMessage.Visible = false;
            }
            else
            {
                lblWarningMessage.Text = Resources.MensajesValidacion.NoDataFound;
                warningMessage.Visible = true;
                gvPager.Visible = false;
            }

            lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, totalReg);
            ActivaIconoOrdenamiento();
        }

        private void ActivaIconoOrdenamiento()
        {
            if (gvMovimiento.HeaderRow == null)
            {
                return;
            }

            LinkButton lnkSender = null;
            LinkButton lnkSortDown = null;
            LinkButton lnkSortUp = null;

            if (this.SortDirection != null && this.SortDirection.ToUpper().Equals("ASC"))
            {
                lnkSender = (LinkButton)gvMovimiento.HeaderRow.FindControl("lnkSortUp" + this.SortExpression);
                if (lnkSender != null)
                    lnkSortDown = (LinkButton)gvMovimiento.HeaderRow.FindControl(lnkSender.ID.Replace("SortUp", "SortDown"));
                if (lnkSortUp != null) lnkSortDown.CssClass = "sort-down";
                if (lnkSender != null) lnkSender.CssClass = "sort-up active";
            }
            else
            {
                lnkSender = (LinkButton)gvMovimiento.HeaderRow.FindControl("lnkSortDown" + this.SortExpression);
                if (lnkSender != null)
                    lnkSortUp = (LinkButton)gvMovimiento.HeaderRow.FindControl(lnkSender.ID.Replace("SortDown", "SortUp"));

                if (lnkSortUp != null) lnkSortUp.CssClass = "sort-up";
                if (lnkSender != null) lnkSender.CssClass = "sort-down active";
            }
        }

        protected void gvMovimiento_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var movimiento = (PR_Movimiento)(e.Row.DataItem);

                if (MovimientoContadorList.Count > 0 && MovimientoContadorList.Find(c => c.CodigoMovimiento == movimiento.Movimiento_Id) != null)
                {
                    Label lblPrendas = (Label)e.Row.FindControl("lblPrendas");
                    if (lblPrendas != null && lblPrendas.Text == string.Empty)
                    {
                        lblPrendas.Text = MovimientoContadorList.Find(c => c.CodigoMovimiento == movimiento.Movimiento_Id).Prendas.ToString();
                    }
                }
            }
        }


        private IQueryable<PR_Movimiento> OrdenarQuery(IQueryable<PR_Movimiento> listarQuery)
        {
            if (this.SortExpression == null || this.SortExpression.Trim().Equals(""))
            {
                this.SortExpression = "Id";
            }


            if (this.SortExpression == "Id")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Movimiento_Id);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Movimiento_Id);
                }
            }
            else if (this.SortExpression == "Fecha")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Movimiento_Fecha);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Movimiento_Fecha);
                }
            }
            else if (this.SortExpression == "Proceso")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Proceso_Descripcion);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Proceso_Descripcion);
                }
            }
            else if (this.SortExpression == "Actividad")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Actividad_Descripcion);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Actividad_Descripcion);
                }
            }
            else if (this.SortExpression == "Sector")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Proveedor_Nombre);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Proveedor_Nombre);
                }
            }
            else if (this.SortExpression == "Linea")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Linea_Descripcion);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Linea_Descripcion);
                }
            }
            else if (this.SortExpression == "OrdenProduccion")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.OrdPro_Id);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.OrdPro_Id);
                }
            }
            else if (this.SortExpression == "Estilo")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.Estilo_Id);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.Estilo_Id);
                }
            }

            return listarQuery;
        }

        protected void gvMovimiento_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (gvMovimiento.HeaderRow == null)
                {
                    return;
                }

                this.SortExpression = e.CommandArgument != null ? e.CommandArgument.ToString() : "Id";
                this.SortDirection = e.CommandName.Equals("SortUp") ? "ASC" : "DES";

                ListarOrdenes();

            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnProveedor_Click(object sender, EventArgs e)
        {
            ProveedorAdd1.ListarProveedores();
        }

        protected void ProveedorAdd_Seleccionado(object sender, EventArgs e)
        {
            txtProveedor.Text = ProveedorAdd1.DescripcionSeleccionado;
        }

        protected void btnProceso_Click(object sender, EventArgs e)
        {
            ProcesoAdd1.ListarProcesos();
        }

        protected void ProcesoAdd_Seleccionado(object sender, EventArgs e)
        {
            txtProceso.Text = ProcesoAdd1.DescripcionSeleccionado;
        }

        protected void btnActividad_Click(object sender, EventArgs e)
        {
            ActividadAdd1.ProcesoId = ProcesoAdd1.CodigoSeleccionado;
            ActividadAdd1.ListarActividades();
        }

        protected void ActividadAdd_Seleccionado(object sender, EventArgs e)
        {
            txtActividad.Text = ActividadAdd1.DescripcionSeleccionado;
            CargaLineas();
        }

        private void CargaLineas()
        {
            TablasDataContext database = new TablasDataContext();

            var lstLinea = from lineas in database.TG_Linea
                           where lineas.Proceso_Id == ProcesoAdd1.CodigoSeleccionado
                              && lineas.Actividad_Id == ActividadAdd1.CodigoSeleccionado
                           select lineas;

            ddlLinea.DataSource = lstLinea;
            ddlLinea.DataValueField = "Linea_Id";
            ddlLinea.DataTextField = "Linea_Descripcion";
            ddlLinea.DataBind();
            ddlLinea.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlLinea.SelectedValue = "0";
        }
    }
}